﻿Перем юТест;

Функция Версия() Экспорт
	Возврат "0.1";
КонецФункции

Функция ПолучитьСписокТестов(ЮнитТестирование) Экспорт

	юТест = ЮнитТестирование;

	ВсеТесты = Новый Массив;

	СИ = Новый СистемнаяИнформация;
	Если (Найти(СИ.ВерсияОС, "Windows") > 0) И Не (ПеременныеСреды().Получить("APPVEYOR") = "True") Тогда
		ВсеТесты.Добавить("ТестДолжен_ПроверитьУстановкуЧисловыхСвойств");
		ВсеТесты.Добавить("ТестДолжен_ПроверитьВызовСОпциональнымиПараметрами");
	КонецЕсли;

	ВсеТесты.Добавить("ТестДолжен_ПроверитьСозданиеClrОбъекта");
	ВсеТесты.Добавить("ТестДолжен_ПроверитьСозданиеClrКоллекции");
	ВсеТесты.Добавить("ТестДолжен_ПроверитьСозданиеClrКоллекцииШаблона");
	ВсеТесты.Добавить("ТестДолжен_ПроверитьТипыClrОбъектов");
	ВсеТесты.Добавить("ТестДолжен_ПроверитьРаботуGetType");
	ВсеТесты.Добавить("ТестДолжен_ПроверитьРаботуGetTypeДляЭлементовСписка");
	ВсеТесты.Добавить("ТестДолжен_ПроверитьРаботуGetTypeДляCLRКоллекции");
	ВсеТесты.Добавить("ТестДолжен_ПроверитьРаботуТипаНеИзЯдра");

	Возврат ВсеТесты;
КонецФункции

Процедура ТестДолжен_ПроверитьУстановкуЧисловыхСвойств() Экспорт

	conn = Новый ComObject("ADODB.Connection");
	conn.ConnectionString = "Driver={MySQL ODBC 3.51 Driver}; Server=obr-mdb-01; Port=3306; UID=v8; PWD=G0bl1n76; database=db1cprod; option=3;";
	conn.CommandTimeOut= 30;

КонецПроцедуры

Процедура ТестДолжен_ПроверитьВызовСОпциональнымиПараметрами() Экспорт

	conn = Новый ComObject("ADODB.Connection");
	conn.ConnectionString = "Driver={fake driver}; Server=obr-mdb-01; Port=3306; UID=v8; PWD=G0bl1n76; database=db1cprod; option=3;";
	conn.CommandTimeOut= 30;

	Попытка
		conn.Open(,,);
	Исключение
		Инфо = ИнформацияОбОшибке().Причина;
		Если Инфо = Неопределено Тогда
			Инфо = ИнформацияОбОшибке();
		КонецЕсли;
		
		юТест.ПроверитьИстину(Найти(Инфо.Описание,"[Microsoft]") > 0, Инфо.Описание);
	КонецПопытки;

КонецПроцедуры

Процедура ТестДолжен_ПроверитьСозданиеClrОбъекта() Экспорт

	РоднойОбъект = Новый COMОбъект("System.Random");
	РоднойОбъект.Next();
	РоднойОбъект.Next(10);
	РоднойОбъект.Next(10, 20);
	РоднойОбъект.NextDouble();

КонецПроцедуры

Процедура ТестДолжен_ПроверитьСозданиеClrКоллекции() Экспорт

	РоднаяКоллекцияНеШаблон = Новый COMОбъект("System.Collections.ArrayList");
	РоднаяКоллекцияНеШаблон.Add(1);
	РоднаяКоллекцияНеШаблон.Add("string");
	РоднаяКоллекцияНеШаблон.Add('20170808');

	юТест.ПроверитьРавенство(РоднаяКоллекцияНеШаблон.Count, 3);
	юТест.ПроверитьРавенство(РоднаяКоллекцияНеШаблон[0], 1);
	юТест.ПроверитьРавенство(РоднаяКоллекцияНеШаблон[1], "string");
	юТест.ПроверитьРавенство(РоднаяКоллекцияНеШаблон[2], '20170808');

КонецПроцедуры

Процедура ТестДолжен_ПроверитьСозданиеClrКоллекцииШаблона() Экспорт

	РоднаяКоллекцияШаблон = Новый COMОбъект("System.Collections.Generic.List`1");
	РоднаяКоллекцияШаблон.Add(1);
	РоднаяКоллекцияШаблон.Add("string");
	РоднаяКоллекцияШаблон.Add('20170808');

	юТест.ПроверитьРавенство(РоднаяКоллекцияШаблон.Count, 3);
	юТест.ПроверитьРавенство(РоднаяКоллекцияШаблон[0], 1);
	юТест.ПроверитьРавенство(РоднаяКоллекцияШаблон[1], "string");
	юТест.ПроверитьРавенство(РоднаяКоллекцияШаблон[2], '20170808');

КонецПроцедуры

Процедура ТестДолжен_ПроверитьТипыClrОбъектов() Экспорт

	РодноеСоответствие = Новый ComОбъект("System.Collections.Generic.Dictionary`2");
	РодноеСоответствие.Add("str", 123);

	юТест.ПроверитьРавенство  (ТипЗнч(РодноеСоответствие), Тип("COMОбъект"), "CLR-тип как COM-объект");

	Для Каждого мКлючЗначение Из РодноеСоответствие Цикл
		юТест.ПроверитьРавенство(ТипЗнч(мКлючЗначение), Тип("COMОбъект"), "CLR-тип как COM-объект");
	КонецЦикла;

КонецПроцедуры

Процедура ПроверитьРаботуGetTypeДляОдногоТипа(ИмяПроверяемогоТипаИлиОбъект, ПространствоИмен, Имя, ЭтоОбъект = Ложь) Экспорт
	
	Если ТипЗнч(ИмяПроверяемогоТипаИлиОбъект) = Тип("Строка") И НЕ ЭтоОбъект Тогда
		ИмяПроверяемогоТипа = ИмяПроверяемогоТипаИлиОбъект;
		Объект = Новый COMОбъект(ИмяПроверяемогоТипа);
	Иначе
		Объект = ИмяПроверяемогоТипаИлиОбъект;
		юТест.ПроверитьРавенство(ТипЗнч(Объект), Тип("COMОбъект"), "Объект как COM-объект");
	КонецЕсли;

	Рефлектор = Новый Рефлектор;

	юТест.ПроверитьИстину(Рефлектор.МетодСуществует(Объект, "GetType"), "Существует метод `GetType()`, Имя типа " + ИмяПроверяемогоТипа);
	
	ТипОбъекта = Объект.GetType();

	юТест.ПроверитьРавенство(ТипЗнч(ТипОбъекта), Тип("COMОбъект"), "Тип - COM-объект " + ИмяПроверяемогоТипа);

	юТест.ПроверитьРавенство(ВРЕГ(ПространствоИмен), ВРЕГ(ТипОбъекта.Namespace), "Получили тот тип, который просили " + ИмяПроверяемогоТипа);
	юТест.ПроверитьРавенство(ВРЕГ(Имя), ВРЕГ(ТипОбъекта.Name), "Получили тот тип, который просили " + ИмяПроверяемогоТипа);
		
КонецПроцедуры
	
Процедура ТестДолжен_ПроверитьРаботуGetType() Экспорт

	ПроверитьРаботуGetTypeДляОдногоТипа("System.Random", "System", "Random");
	ПроверитьРаботуGetTypeДляОдногоТипа("System.Collections.ArrayList", "System.Collections", "ArrayList");
	ПроверитьРаботуGetTypeДляОдногоТипа("System.Collections.Generic.List`1", "System.Collections.Generic", "List`1");
	ПроверитьРаботуGetTypeДляОдногоТипа("System.Collections.Generic.Dictionary`2", "System.Collections.Generic", "Dictionary`2");
	
КонецПроцедуры

Процедура ТестДолжен_ПроверитьРаботуGetTypeДляЭлементовСписка() Экспорт

	РоднаяКоллекция = Новый COMОбъект("System.Collections.ArrayList");
	РоднаяКоллекция.Add(1);
	РоднаяКоллекция.Add("string");
	РоднаяКоллекция.Add('20170808');
	РоднаяКоллекция.Add(Новый COMОбъект("System.Random"));

	юТест.ПроверитьРавенство(ТипЗнч(РоднаяКоллекция[0]), Тип("Число"), "Элемент [0] - это число");
	юТест.ПроверитьРавенство(ТипЗнч(РоднаяКоллекция[1]), Тип("Строка"), "Элемент [1] - это строка");
	юТест.ПроверитьРавенство(ТипЗнч(РоднаяКоллекция[2]), Тип("Дата"), "Элемент [2] - это дата");
	ПроверитьРаботуGetTypeДляОдногоТипа(РоднаяКоллекция[3], "System", "Random");
	
КонецПроцедуры

Процедура ТестДолжен_ПроверитьРаботуGetTypeДляCLRКоллекции() Экспорт

	РоднаяКоллекция = Новый ComОбъект("System.Collections.Generic.Dictionary`2");
	РоднаяКоллекция.Add("str", 123);

	Для Каждого мКлючЗначение Из РоднаяКоллекция Цикл
		юТест.ПроверитьРавенство(ТипЗнч(мКлючЗначение), Тип("COMОбъект"), "CLR-тип как COM-объект");
		
		ПроверитьРаботуGetTypeДляОдногоТипа(мКлючЗначение, "System.Collections.Generic", "KEYVALUEPAIR`2");
		юТест.ПроверитьРавенство(ТипЗнч(мКлючЗначение.Key), Тип("Строка"), "мКлючЗначение.Key - это строка");
		юТест.ПроверитьРавенство(ТипЗнч(мКлючЗначение.Value), Тип("Число"), "мКлючЗначение.Value - это число");
	КонецЦикла;

	
КонецПроцедуры

Процедура ТестДолжен_ПроверитьРаботуТипаНеИзЯдра() Экспорт

	Ури = Новый COMОбъект("System.Uri", "file:///some/file.txt"); // тип НЕ из mscorlib.dll. Должен просто создаться и не упасть
	юТест.ПроверитьРавенство(Ури.IsFile, Истина);
	ПроверитьРаботуGetTypeДляОдногоТипа(Ури, "System", "Uri");

КонецПроцедуры
